package Verwaltung.Daten;

import Verwaltung.Daten.Interfaces.ILehrkraft;

public class Betreuer implements ILehrkraft {

	private int id = 0; // id
	private String log; // login name
	private int ws; // wochenstunden
	private String nam; // name
	private String pw; // passwort
	private int plvl = 0; // permissionlvl, 0 oder 1
	private boolean teach = false; // unterrichtserlaubniss

	/**
	 * Erstellt einen Betreuer
	 * 
	 * @param loginName
	 *            eindeutiger Name des Betreuers
	 * @param wochenstunden
	 *            Anzahl der Stunden die der Betreuer arbeiten kann
	 * @param name
	 *            Name des Betreuers
	 * @param permissionLvl
	 * @param password
	 */
	public Betreuer(final String loginName, final int wochenstunden,
			final String name, final String password, final int permissionLvl) {
		if (loginName != null && 3 < loginName.length() && 0 <= wochenstunden
				&& wochenstunden <= 70 && 3 < name.length()
				&& 3 < password.length()
				&& (permissionLvl == 1 || permissionLvl == 0)) {
			log = loginName;
			ws = wochenstunden;
			nam = name;
			pw = password;
			plvl = permissionLvl;
		} else {
			throw new IllegalArgumentException("Ungueltige Eingabe");
		}
	}

	/**
	 * Gibt den Namen des Lehrers zurueck.
	 * 
	 * @return Name des Lehrers
	 */
	@Override
	public String getName() {
		return nam;
	}

	/**
	 * Gibt den Login-Namen des Lehrers zureuck.
	 * 
	 * @return loginName des Lehrers
	 */
	@Override
	public String getLoginName() {
		return log;
	}

	/**
	 * Gibt die Wochenstunden die der Lehrer abreiten darf zurueck.
	 * 
	 * @param wochenstunden
	 */
	@Override
	public int getWochenstunden() {
		return ws;
	}

	/**
	 * Gibt an ob der Lehrer unterrichten darf. true = darf unterrichten false =
	 * darf nicht unterrichten
	 * 
	 * @param Unterrichtserlaubnis
	 */
	@Override
	public boolean darfUnterrichten() {
		return teach;
	}

	/**
	 * Ändert den eindeutigen Namen eines Betreuers
	 * 
	 * @param neuerLogin
	 *            neuer eindeutiger Name eines Betreuers
	 */
	/**
	 * Ändert den eindeutigen Namen eines Betreuers
	 * 
	 * @param neuerLogin
	 *            neuer LogIn : mindestens 3 Zeichen lang
	 */
	@Override
	public void setLogin(final String neuerLogin) {
		if (3 < neuerLogin.length()) {
			log = neuerLogin;
		} else {
			throw new IllegalArgumentException("Login Name ist zu kurz.");
		}
	}

	/**
	 * Ändert den Namen es Betreuers
	 * 
	 * @param neuerName
	 *            neuer Name : mindestens 3 Zeichen lang
	 */
	@Override
	public void setName(final String neuerName) {
		if (3 < neuerName.length()) {
			nam = neuerName;
		} else {
			throw new IllegalArgumentException("Name ist zu kurz.");
		}
	}

	/**
	 * Ändert die anzhal der Stunden pro Woche die ein Betreurer arbeitet
	 * 
	 * @parma neueStunden anzhal der neuen arbeitsstunden
	 */
	@Override
	public void setArbeitsstunden(final int neueStunden) {
		if (0 <= neueStunden && neueStunden <= 70) {
			ws = neueStunden;
		} else {
			throw new IllegalArgumentException("Ungueltige Eingabe");
		}
	}

	/**
	 * Setzt das Passwort des Betreuers neu.
	 * 
	 * @param neues
	 *            Passwort : mindestens 3 Zeichen lang
	 */
	@Override
	public void setPassword(final String password) {
		if (3 < password.length()) {
			pw = password;
		} else {
			throw new IllegalArgumentException("Passwort zu kurz.");
		}

	}

	/**
	 * Setzt das permission Level des Betreuers neu.
	 * 
	 * @param permissionLvl
	 *            : 0 oder 1
	 */
	@Override
	public void setPermissionLvl(final int permissionLvl) {
		if (permissionLvl == 1 || permissionLvl == 0) {
			plvl = permissionLvl;
		} else {
			throw new IllegalArgumentException("Ungueltiges Permission Levle.");
		}

	}

	/**
	 * Gibt die Klasse als String aus
	 * 
	 * @return login namen des betreuers
	 */
	@Override
	public String toString() {
		return log;
	}

	/**
	 * Gibt das Passwort des Betreus zurueck.
	 * 
	 * @return password
	 */
	@Override
	public String getPassword() {
		return pw;
	}

	/**
	 * Gibt das PermissionLevel des Betreus zurueck.
	 * 
	 * @return permissionLvl : 0 oder 1
	 */
	@Override
	public int getPermissionLvl() {
		return plvl;
	}

	/**
	 * Erlaubt oder verbietet es einem Betreuer zu unterrichten. true = darf
	 * unterrichten false = darf nicht unterrichten
	 * 
	 * @param unterrichtserlaubniss
	 */
	@Override
	public void setDarfUnterrichten(final boolean unterrichtserlaubnis) {
		teach = unterrichtserlaubnis;
	}

	@Override
	public int getID() {
		return id;
	}

	public void setId(final int id) {
		this.id = id;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((log == null) ? 0 : log.hashCode());
		result = prime * result + ((nam == null) ? 0 : nam.hashCode());
		result = prime * result + plvl;
		result = prime * result + ((pw == null) ? 0 : pw.hashCode());
		result = prime * result + (teach ? 1231 : 1237);
		result = prime * result + ws;
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(final Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		final Betreuer other = (Betreuer) obj;
		if (id != other.id) {
			return false;
		}
		if (log == null) {
			if (other.log != null) {
				return false;
			}
		} else if (!log.equals(other.log)) {
			return false;
		}
		if (nam == null) {
			if (other.nam != null) {
				return false;
			}
		} else if (!nam.equals(other.nam)) {
			return false;
		}
		if (plvl != other.plvl) {
			return false;
		}
		if (pw == null) {
			if (other.pw != null) {
				return false;
			}
		} else if (!pw.equals(other.pw)) {
			return false;
		}
		if (teach != other.teach) {
			return false;
		}
		if (ws != other.ws) {
			return false;
		}
		return true;
	}

}
